//Include
#include "lavagem.h"

//Variaveis
unsigned int i = 0;
static int estado;
static int process = O_NENHUM;
static int loop = 0;
static int var_pass1;
static int var_pass2;
static int var_pass3;
static int var_pass4;

int password1 = 1;
int password2 = 1;
int password3 = 1;
int password4 = 1;


//Funcoes Locais
void delay_min(unsigned int i);
void analise_estado();
void menu_timer();
void menu_restaurar();
void COMPLETA_APRE();
void ENXAGUE_APRE();
void segundo_Processo_APRE();
void primeiro_Processo_APRE();
void password();

int retorna_estado(){
	return estado;
}
int retorna_process(){
	return process;
}

void set_process(int setProcess){
	process = setProcess;
}
void set_estado(int setEstado){
	estado = setEstado;
}
//Inicializa pinos
void init_lavagem(){

	//Saidas
	GPIO_InitTypeDef INIT_OUTPUT;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	INIT_OUTPUT.GPIO_Speed = GPIO_Speed_50MHz;
	INIT_OUTPUT.GPIO_Mode  = GPIO_Mode_Out_PP;
	INIT_OUTPUT.GPIO_Pin = (GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14);
	GPIO_Init(GPIOB, &INIT_OUTPUT);

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	INIT_OUTPUT.GPIO_Pin = (GPIO_Pin_10 | GPIO_Pin_11);
	GPIO_Init(GPIOA, &INIT_OUTPUT);

	//Entradas
	GPIO_InitTypeDef INIT_INPUT;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
	INIT_INPUT.GPIO_Pin = (GPIO_Pin_8);
	INIT_INPUT.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	INIT_INPUT.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOC, &INIT_INPUT);

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	INIT_INPUT.GPIO_Pin = (GPIO_Pin_8 | GPIO_Pin_9);
	GPIO_Init(GPIOA, &INIT_INPUT);
}
//Funcao enxague
void primeiro_Processo(){
	TIM2_delaytimer_reset();
	TIM2_delaytimer_start();
	while(estado != FINAL){
		switch(estado){
		case ETAPA1:
			lcd_etapa(ETAPA1, 1);
			delay_seg(1);
			AGUA_ON
			delay_seg(1);
			lcd_acionamento(ETAPA1);
			delay_min(timer.bkp.ciclo_ETAPA1);
			AGUA_OFF
			delay_seg(1);
			lcd_etapa(ETAPA1, 0);
			delay_seg(2);
			estado = ETAPA2;
			break;
		case ETAPA2:
			lcd_etapa(ETAPA2, 1);
			delay_seg(1);
			BOMBA_ON
			delay_seg(1);
			lcd_acionamento(ETAPA2);
			delay_min(timer.bkp.ciclo_ETAPA2);
			BOMBA_OFF
			delay_seg(1);
			lcd_etapa(ETAPA2, 0);
			delay_seg(2);
			estado = ETAPA3;
			break;
		case ETAPA3:
			lcd_etapa(ETAPA3, 1);
			delay_seg(1);
			lcd_acionamento(ETAPA3);
			delay_seg(1);
			BOMBA_ON
			DRENO_ON
			delay_min(timer.bkp.ciclo_ETAPA3);
			BOMBA_OFF
			DRENO_OFF
			delay_seg(1);
			lcd_etapa(ETAPA3, 0);
			delay_seg(2);
			estado = FINAL;
			break;
		default:
			estado = FINAL;
			break;
		}
	}
}

//Funcao lavagem completa
void segundo_Processo(){
	while(estado != FINAL){
		switch(estado){
		case ETAPA4:
			lcd_etapa(ETAPA4, 1);
			delay_seg(1);
			lcd_acionamento(ETAPA4);
			delay_seg(1);
			AGUA_ON
			delay_min(timer.bkp.ciclo_ETAPA4);
			AGUA_OFF
			delay_seg(1);
			lcd_etapa(ETAPA4, 0);
			delay_seg(2);
			estado = ETAPA5;
			break;
		case ETAPA5:
			lcd_etapa(ETAPA5, 1);
			delay_seg(1);
			lcd_acionamento(ETAPA5);
			delay_seg(1);
			BOMBA_ON
			DET_ON
			RES_ON
			delay_min(timer.bkp.ciclo_ETAPA5);
			BOMBA_OFF
			DET_OFF
			RES_OFF
			delay_seg(1);
			lcd_etapa(ETAPA5, 0);
			delay_seg(2);
			estado = ETAPA6;
			break;
		case ETAPA6:
			lcd_etapa(ETAPA6, 1);
			delay_seg(1);
			lcd_acionamento(ETAPA6);
			delay_seg(1);
			BOMBA_ON
			RES_ON
			delay_min(timer.bkp.ciclo_ETAPA6);
			BOMBA_OFF
			RES_OFF
			delay_seg(1);
			lcd_acionamento(ETAPA8);
			delay_seg(2);
			lcd_etapa(ETAPA6, 0);
			delay_seg(2);
			estado = ETAPA7;
			break;
		case ETAPA7:
			lcd_etapa(ETAPA7, 1);
			delay_seg(1);
			lcd_acionamento(ETAPA7);
			delay_seg(1);
			BOMBA_ON
			DRENO_ON
			delay_min(timer.bkp.ciclo_ETAPA7);
			BOMBA_OFF
			DRENO_OFF
			delay_seg(1);
			lcd_etapa(ETAPA7, 0);
			delay_seg(2);
			estado = FINAL;
			break;
		default:
			estado = FINAL;
			break;
		}
	}

}

void ENXAGUE(){
	if(BT_INICIO == Bit_RESET && estado == menu && process == O_ENXAGUE){
		set_estado(INICIO);
		lcd_lavagem(enxague);
		delay_seg(5);
		estado = ETAPA1;
		primeiro_Processo();
		lcd_acionamento(FINAL);
		delay_seg(2);
		lcd_init();
		estado = INICIO;
		process = O_ENXAGUE;
		lcd_lavagem(press_bt);
		reset_count();
	}
}

void COMPLETA(){
	if(BT_INICIO == Bit_RESET && estado == menu && process == O_COMPLETA){
		set_estado(INICIO);
		lcd_lavagem(lav_comp);
		delay_seg(5);
		estado = ETAPA1;
		primeiro_Processo();
		estado = ETAPA4;
		segundo_Processo();
		estado = ETAPA1;
		primeiro_Processo();
		lcd_acionamento(FINAL);
		delay_seg(2);
		estado = INICIO;
		process = O_COMPLETA;
		lcd_lavagem(press_bt);
		reset_count();
	}
}

void delay_min(unsigned int i){
	unsigned temp = 61*i;
	delay_seg(temp);
}

void delay_seg(unsigned int temp){
	int j = 0;
	unsigned int i = 0;
	while(j<temp){
		for(i=0;i<0x9FFF6;i++);
		j++;
	}
}


void EXTI9_5_IRQHandler(void)
{
	uint32_t k = 0;
	debounce
	if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_9) == Bit_SET){
		EXTI_ClearITPendingBit(EXTI_Line9);
	}
    if (EXTI_GetITStatus(EXTI_Line9) != RESET)
    {
    	TIM2_delaytimer_reset();
    	lcd_clear();
    	lcd_lavagem(interrupcao);
    	struct bkp backup;
    	backup.agua = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_10);
    	backup.bomba = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_13);
    	backup.det  = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_14);
    	backup.dreno = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_12);
    	backup.res = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11);
    	backup.led_enxague = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_10);
    	backup.led_completa = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_11);
    	loop = 1;
    	debounce
    	while(BT_Volta_Int == Bit_SET){
    		TIM2_delaytimer_reset();
    		AGUA_OFF
    		BOMBA_OFF
    		DRENO_OFF
    		DET_OFF
    		RES_OFF
    		LED_ENXAGUE_ON
    		LED_COMPLETA_ON
    		if(BT_INICIO == Bit_RESET && process != O_TESTE){
    			debounce
    			menu_timer();
    			delay_seg(1);
    			lcd_lavagem(interrupcao);
    		}
    		if(BT_ENXAGUE == Bit_RESET && process != O_TESTE){
    			debounce
    			menu_restaurar();
    			delay_seg(1);
    			lcd_lavagem(interrupcao);
    		}
    		if(process == O_TESTE && BT_ENXAGUE == Bit_RESET && BT_INICIO == Bit_RESET){
    			delay_seg(1);
    			process = O_NENHUM;
    			EXTI_ClearITPendingBit(EXTI_Line9);
    		}
    	}
    	lcd_acionamento(retorna_estado());
    	analise_estado();
    	GPIO_WriteBit(GPIOB, GPIO_Pin_10,backup.agua);
    	GPIO_WriteBit(GPIOB, GPIO_Pin_13,backup.bomba);
    	GPIO_WriteBit(GPIOB, GPIO_Pin_14,backup.det);
    	GPIO_WriteBit(GPIOB, GPIO_Pin_12,backup.dreno);
    	GPIO_WriteBit(GPIOB, GPIO_Pin_11,backup.res);
    	GPIO_WriteBit(GPIOA, GPIO_Pin_10,backup.led_enxague);
    	GPIO_WriteBit(GPIOA, GPIO_Pin_11,backup.led_completa);
        EXTI_ClearITPendingBit(EXTI_Line9);
    }
}

void analise_estado(){
	switch(retorna_estado()){
	case menu:
		lcd_lavagem(press_bt);
		break;
	case INICIO:
		if(process == O_COMPLETA)
			lcd_lavagem(lav_comp);
		else
			lcd_lavagem(enxague);
		break;
	case FINAL:
		if(process == O_ENXAGUE)
			lcd_lavagem(sel_enxague);
		else
			lcd_lavagem(sel_lav_comp);
		delay_seg(1);
		lcd_lavagem(press_bt);
		break;
	default:
		break;
	}
}

void menu_restaurar(){
	uint32_t k = 0;
	for(k = 0; k< 100000; k++);
	int status = nenhum;
	lcd_rest_fabrica(status);
	while(status == nenhum){
		if(BT_INICIO == Bit_RESET){
			timer.bkp.ciclo_ETAPA1 = 3;
			timer.bkp.ciclo_ETAPA2 = 1;
			timer.bkp.ciclo_ETAPA3 = 4;
			timer.bkp.ciclo_ETAPA4 = 4;
			timer.bkp.ciclo_ETAPA5 = 5;
			timer.bkp.ciclo_ETAPA6 = 15;
			timer.bkp.ciclo_ETAPA7 = 4;
			writeFlash(timer);
			status = confirma;
			lcd_rest_fabrica(status);
		}
		if(BT_Volta_Int == Bit_RESET){
			status = cancela;
			lcd_rest_fabrica(status);
		}
	}
}

void menu_timer(){
	lcd_set_etapa(-1, enx);
//----------------Etapa1---------------------------------------------
	if(process != O_APRE && process != O_COMPLETA_APRE && process != O_ENXAGUE_APRE)
		lcd_set_etapa(timer.bkp.ciclo_ETAPA1,ETAPA1);
	else if(process == O_APRE || process == O_COMPLETA_APRE || process == O_ENXAGUE_APRE)
		lcd_set_etapa_APRE(timer.bkp.ciclo_ETAPA1,ETAPA1);
	delay_seg(1);
	while(BT_INICIO == Bit_SET){
		if(BT_ENXAGUE == Bit_RESET){
			timer.bkp.ciclo_ETAPA1++;
			if(process != O_APRE && process != O_COMPLETA_APRE && process != O_ENXAGUE_APRE)
					lcd_set_etapa(timer.bkp.ciclo_ETAPA1,ETAPA1);
				else if(process == O_APRE || process == O_COMPLETA_APRE || process == O_ENXAGUE_APRE)
					lcd_set_etapa_APRE(timer.bkp.ciclo_ETAPA1,ETAPA1);
		}
		if(BT_Volta_Int == Bit_RESET){
			if(timer.bkp.ciclo_ETAPA1 > 1)
				timer.bkp.ciclo_ETAPA1--;
			else
				timer.bkp.ciclo_ETAPA1 = 1;
			if(process != O_APRE && process != O_COMPLETA_APRE && process != O_ENXAGUE_APRE)
					lcd_set_etapa(timer.bkp.ciclo_ETAPA1,ETAPA1);
				else if(process == O_APRE || process == O_COMPLETA_APRE || process == O_ENXAGUE_APRE)
					lcd_set_etapa_APRE(timer.bkp.ciclo_ETAPA1,ETAPA1);
		}
	}
//-------------------------------------------------------------------

//----------------Etapa2---------------------------------------------
	if(process != O_APRE && process != O_COMPLETA_APRE && process != O_ENXAGUE_APRE)
			lcd_set_etapa(timer.bkp.ciclo_ETAPA2,ETAPA2);
		else if(process == O_APRE || process == O_COMPLETA_APRE || process == O_ENXAGUE_APRE)
			lcd_set_etapa_APRE(timer.bkp.ciclo_ETAPA2,ETAPA2);
	while(BT_INICIO == Bit_SET){
		if(BT_ENXAGUE == Bit_RESET){
			timer.bkp.ciclo_ETAPA2++;
			if(process != O_APRE && process != O_COMPLETA_APRE && process != O_ENXAGUE_APRE)
					lcd_set_etapa(timer.bkp.ciclo_ETAPA2,ETAPA2);
				else if(process == O_APRE || process == O_COMPLETA_APRE || process == O_ENXAGUE_APRE)
					lcd_set_etapa_APRE(timer.bkp.ciclo_ETAPA2,ETAPA2);
		}
		if(BT_Volta_Int == Bit_RESET){
			if(timer.bkp.ciclo_ETAPA2 > 1)
				timer.bkp.ciclo_ETAPA2--;
			else
				timer.bkp.ciclo_ETAPA2 = 1;
			if(process != O_APRE && process != O_COMPLETA_APRE && process != O_ENXAGUE_APRE)
					lcd_set_etapa(timer.bkp.ciclo_ETAPA2,ETAPA2);
				else if(process == O_APRE || process == O_COMPLETA_APRE || process == O_ENXAGUE_APRE)
					lcd_set_etapa_APRE(timer.bkp.ciclo_ETAPA2,ETAPA2);
		}
	}
//-------------------------------------------------------------------

//----------------Etapa3---------------------------------------------
	if(process != O_APRE && process != O_COMPLETA_APRE && process != O_ENXAGUE_APRE)
			lcd_set_etapa(timer.bkp.ciclo_ETAPA3,ETAPA3);
		else if(process == O_APRE || process == O_COMPLETA_APRE || process == O_ENXAGUE_APRE)
			lcd_set_etapa_APRE(timer.bkp.ciclo_ETAPA3,ETAPA3);
	while(BT_INICIO == Bit_SET){
			if(BT_ENXAGUE == Bit_RESET){
				timer.bkp.ciclo_ETAPA3++;
				if(process != O_APRE && process != O_COMPLETA_APRE && process != O_ENXAGUE_APRE)
						lcd_set_etapa(timer.bkp.ciclo_ETAPA3,ETAPA3);
					else if(process == O_APRE || process == O_COMPLETA_APRE || process == O_ENXAGUE_APRE)
						lcd_set_etapa_APRE(timer.bkp.ciclo_ETAPA3,ETAPA3);
				}
			if(BT_Volta_Int == Bit_RESET){
				if(timer.bkp.ciclo_ETAPA3 > 1)
					timer.bkp.ciclo_ETAPA3--;
				else
					timer.bkp.ciclo_ETAPA3 = 1;
				if(process != O_APRE && process != O_COMPLETA_APRE && process != O_ENXAGUE_APRE)
						lcd_set_etapa(timer.bkp.ciclo_ETAPA3,ETAPA3);
					else if(process == O_APRE || process == O_COMPLETA_APRE || process == O_ENXAGUE_APRE)
						lcd_set_etapa_APRE(timer.bkp.ciclo_ETAPA3,ETAPA3);
			}
	}
//-------------------------------------------------------------------
	lcd_set_etapa(-1, comp);
//----------------Etapa4---------------------------------------------
	if(process != O_APRE && process != O_COMPLETA_APRE && process != O_ENXAGUE_APRE)
			lcd_set_etapa(timer.bkp.ciclo_ETAPA4,ETAPA4);
		else if(process == O_APRE || process == O_COMPLETA_APRE || process == O_ENXAGUE_APRE)
			lcd_set_etapa_APRE(timer.bkp.ciclo_ETAPA4,ETAPA4);
	while(BT_INICIO == Bit_SET){
		if(BT_ENXAGUE == Bit_RESET){
			timer.bkp.ciclo_ETAPA4++;
			if(process != O_APRE && process != O_COMPLETA_APRE && process != O_ENXAGUE_APRE)
					lcd_set_etapa(timer.bkp.ciclo_ETAPA4,ETAPA4);
				else if(process == O_APRE || process == O_COMPLETA_APRE || process == O_ENXAGUE_APRE)
					lcd_set_etapa_APRE(timer.bkp.ciclo_ETAPA4,ETAPA4);
		}
		if(BT_Volta_Int == Bit_RESET){
			if(timer.bkp.ciclo_ETAPA4 > 1)
				timer.bkp.ciclo_ETAPA4--;
			else
				timer.bkp.ciclo_ETAPA4 = 1;
			if(process != O_APRE && process != O_COMPLETA_APRE && process != O_ENXAGUE_APRE)
					lcd_set_etapa(timer.bkp.ciclo_ETAPA4,ETAPA4);
				else if(process == O_APRE || process == O_COMPLETA_APRE || process == O_ENXAGUE_APRE)
					lcd_set_etapa_APRE(timer.bkp.ciclo_ETAPA4,ETAPA4);
		}
	}
//-------------------------------------------------------------------

//----------------Etapa5---------------------------------------------
	if(process != O_APRE && process != O_COMPLETA_APRE && process != O_ENXAGUE_APRE)
			lcd_set_etapa(timer.bkp.ciclo_ETAPA5,ETAPA5);
		else if(process == O_APRE || process == O_COMPLETA_APRE || process == O_ENXAGUE_APRE)
			lcd_set_etapa_APRE(timer.bkp.ciclo_ETAPA5,ETAPA5);
	while(BT_INICIO == Bit_SET){
		if(BT_ENXAGUE == Bit_RESET){
			timer.bkp.ciclo_ETAPA5++;
			if(process != O_APRE && process != O_COMPLETA_APRE && process != O_ENXAGUE_APRE)
					lcd_set_etapa(timer.bkp.ciclo_ETAPA5,ETAPA5);
				else if(process == O_APRE || process == O_COMPLETA_APRE || process == O_ENXAGUE_APRE)
					lcd_set_etapa_APRE(timer.bkp.ciclo_ETAPA5,ETAPA5);
		}
		if(BT_Volta_Int == Bit_RESET){
			if(timer.bkp.ciclo_ETAPA5 > 1)
				timer.bkp.ciclo_ETAPA5--;
			else
				timer.bkp.ciclo_ETAPA5 = 1;
			if(process != O_APRE && process != O_COMPLETA_APRE && process != O_ENXAGUE_APRE)
					lcd_set_etapa(timer.bkp.ciclo_ETAPA5,ETAPA5);
				else if(process == O_APRE || process == O_COMPLETA_APRE || process == O_ENXAGUE_APRE)
					lcd_set_etapa_APRE(timer.bkp.ciclo_ETAPA5,ETAPA5);
		}
	}
//-------------------------------------------------------------------

//----------------Etapa6---------------------------------------------
	if(process != O_APRE && process != O_COMPLETA_APRE && process != O_ENXAGUE_APRE)
			lcd_set_etapa(timer.bkp.ciclo_ETAPA6,ETAPA6);
		else if(process == O_APRE || process == O_COMPLETA_APRE || process == O_ENXAGUE_APRE)
			lcd_set_etapa_APRE(timer.bkp.ciclo_ETAPA6,ETAPA6);
	while(BT_INICIO == Bit_SET){
		if(BT_ENXAGUE == Bit_RESET){
			timer.bkp.ciclo_ETAPA6++;
			if(process != O_APRE && process != O_COMPLETA_APRE && process != O_ENXAGUE_APRE)
					lcd_set_etapa(timer.bkp.ciclo_ETAPA6,ETAPA6);
				else if(process == O_APRE || process == O_COMPLETA_APRE || process == O_ENXAGUE_APRE)
					lcd_set_etapa_APRE(timer.bkp.ciclo_ETAPA6,ETAPA6);
		}
		if(BT_Volta_Int == Bit_RESET){
			if(timer.bkp.ciclo_ETAPA6 > 1)
				timer.bkp.ciclo_ETAPA6--;
			else
				timer.bkp.ciclo_ETAPA6 = 1;
			if(process != O_APRE && process != O_COMPLETA_APRE && process != O_ENXAGUE_APRE)
					lcd_set_etapa(timer.bkp.ciclo_ETAPA6,ETAPA6);
				else if(process == O_APRE || process == O_COMPLETA_APRE || process == O_ENXAGUE_APRE)
					lcd_set_etapa_APRE(timer.bkp.ciclo_ETAPA6,ETAPA6);
		}
	}
//-------------------------------------------------------------------

//----------------Etapa7---------------------------------------------
	if(process != O_APRE && process != O_COMPLETA_APRE && process != O_ENXAGUE_APRE)
			lcd_set_etapa(timer.bkp.ciclo_ETAPA7,ETAPA7);
		else if(process == O_APRE || process == O_COMPLETA_APRE || process == O_ENXAGUE_APRE)
			lcd_set_etapa_APRE(timer.bkp.ciclo_ETAPA7,ETAPA7);
	while(BT_INICIO == Bit_SET){
		if(BT_ENXAGUE == Bit_RESET){
			timer.bkp.ciclo_ETAPA7++;
			if(process != O_APRE && process != O_COMPLETA_APRE && process != O_ENXAGUE_APRE)
					lcd_set_etapa(timer.bkp.ciclo_ETAPA7,ETAPA7);
				else if(process == O_APRE || process == O_COMPLETA_APRE || process == O_ENXAGUE_APRE)
					lcd_set_etapa_APRE(timer.bkp.ciclo_ETAPA7,ETAPA7);
		}
		if(BT_Volta_Int == Bit_RESET){
			if(timer.bkp.ciclo_ETAPA7 > 1)
				timer.bkp.ciclo_ETAPA7--;
			else
				timer.bkp.ciclo_ETAPA7 = 1;
			if(process != O_APRE && process != O_COMPLETA_APRE && process != O_ENXAGUE_APRE)
					lcd_set_etapa(timer.bkp.ciclo_ETAPA7,ETAPA7);
				else if(process == O_APRE || process == O_COMPLETA_APRE || process == O_ENXAGUE_APRE)
					lcd_set_etapa_APRE(timer.bkp.ciclo_ETAPA7,ETAPA7);
		}
	}
	writeFlash(timer);
	lcd_set_etapa(-1, sucesso);
//-------------------------------------------------------------------
}


void password(){
	int pos = pos1;
		int teste = zero;
		int k;
		while(pos != pos_certo){
			switch(pos){
	//-------------------------------------------------------------------------------------------
			case pos1:
				while(BT_INICIO == Bit_SET){
					for(k = 0; k < 100000; k++);
					if(BT_ENXAGUE == Bit_RESET){
						if(teste == zero){
							var_pass1 = 0;
							lcd_dig_password(pos1,var_pass1);
							teste = outro;
						}
						else if(var_pass1 == 9){
							var_pass1 = 0;
							lcd_dig_password(pos1,var_pass1);
						}
						else if(var_pass1 >= 0 && var_pass1 < 9){
							var_pass1++;
							lcd_dig_password(pos1,var_pass1);
						}
					}
					if(BT_Volta_Int == Bit_RESET){
						if(teste == zero){
							var_pass1 = 9;
							lcd_dig_password(pos1,var_pass1);
							teste = outro;
						}
						else if(var_pass1 == 0){
							var_pass1 = 9;
							lcd_dig_password(pos1,var_pass1);
						}
						else if(var_pass1 > 0 && var_pass1 <= 9){
							var_pass1--;
							lcd_dig_password(pos1,var_pass1);
						}
					}
				}
				lcd_asteristico(pos);
				pos = pos2;
				teste = zero;
				delay_seg(1);
				break;
	//-------------------------------------------------------------------------------------------
			case pos2:
				while(BT_INICIO == Bit_SET){
					for(k = 0; k < 100000; k++);
					if(BT_ENXAGUE == Bit_RESET){
						if(teste == zero){
							var_pass2 = 0;
							lcd_dig_password(pos2,var_pass2);
							teste = outro;
						}
						else if(var_pass2 == 9){
							var_pass2 = 0;
							lcd_dig_password(pos2,var_pass2);
						}
						else if(var_pass2 >= 0 && var_pass2 < 9){
							var_pass2++;
							lcd_dig_password(pos2,var_pass2);
						}
					}
					if(BT_Volta_Int == Bit_RESET){
						if(teste == zero){
							var_pass2 = 9;
							lcd_dig_password(pos2,var_pass2);
							teste = outro;
						}
						else if(var_pass2 == 0){
							var_pass2 = 9;
							lcd_dig_password(pos2,var_pass2);
						}
						else if(var_pass2 > 0 && var_pass2 <= 9){
							var_pass2--;
							lcd_dig_password(pos2,var_pass2);
						}
					}
				}
				lcd_asteristico(pos);
				pos = pos3;
				teste = zero;
				delay_seg(1);
				break;
	//-------------------------------------------------------------------------------------------
			case pos3:
				while(BT_INICIO == Bit_SET){
					for(k = 0; k < 100000; k++);
					if(BT_ENXAGUE == Bit_RESET){
						if(teste == zero){
							var_pass3 = 0;
							lcd_dig_password(pos3,var_pass3);
							teste = outro;
						}
						else if(var_pass3 == 9){
							var_pass3 = 0;
							lcd_dig_password(pos3,var_pass3);
						}
						else if(var_pass3 >= 0 && var_pass3 < 9){
							var_pass3++;
							lcd_dig_password(pos3,var_pass3);
						}
					}
					if(BT_Volta_Int == Bit_RESET){
						if(teste == zero){
							var_pass3 = 9;
							lcd_dig_password(pos3,var_pass3);
							teste = outro;
						}
						else if(var_pass3 == 0){
							var_pass3 = 9;
							lcd_dig_password(pos3,var_pass3);
						}
						else if(var_pass3 > 0 && var_pass3 <= 9){
								var_pass3--;
								lcd_dig_password(pos3,var_pass3);
							}
						}
					}
				lcd_asteristico(pos);
				pos = pos4;
				teste = zero;
				delay_seg(1);
				break;
	//-------------------------------------------------------------------------------------------
			case pos4:
				while(BT_INICIO == Bit_SET){
					for(k = 0; k < 100000; k++);
					if(BT_ENXAGUE == Bit_RESET){
						if(teste == zero){
							var_pass4 = 0;
							lcd_dig_password(pos4,var_pass4);
							teste = outro;
						}
						else if(var_pass4 == 9){
							var_pass4 = 0;
							lcd_dig_password(pos4,var_pass4);
						}
						else if(var_pass4 >= 0 && var_pass4 < 9){
								var_pass4++;
								lcd_dig_password(pos4,var_pass4);
							}
						}
					if(BT_Volta_Int == Bit_RESET){
						if(teste == zero){
							var_pass4 = 9;
							lcd_dig_password(pos4,var_pass4);
							teste = outro;
						}
						else if(var_pass4 == 0){
							var_pass4 = 9;
							lcd_dig_password(pos4,var_pass4);
						}
						else if(var_pass4 > 0 && var_pass4 <= 9){
								var_pass4--;
								lcd_dig_password(pos4,var_pass4);
							}
						}
					}
				lcd_asteristico(pos);
				pos = pos_fim;
				delay_seg(1);
				break;
	//-------------------------------------------------------------------------------------------
			case pos_fim:
				lcd_dig_password(pos_fim,-1);
				if(var_pass1 == password1 && var_pass2 == password2 && var_pass3 == password3 && var_pass4 == password4){
					lcd_right_pass();
					pos = pos_certo;
					delay(1);
				}
				else{
					lcd_wrong_pass();
					delay(1);
					lcd_password();
					pos = pos1;
					teste = zero;
				}
				break;
			default:
				break;
			}
		}
}
void program_teste(){
	LED_COMPLETA_ON
	LED_ENXAGUE_ON
	lcd_password();
	password();
	process = O_TESTE;
	lcd_prog_teste();
	estado = ETAPA1;
	while(process == O_TESTE){
		switch(estado){
		case ETAPA1:
			lcd_acionamento(ETAPA1);
			AGUA_ON
			delay_seg(5);
			AGUA_OFF
			delay_seg(2);
			estado = ETAPA2;
			break;
		case ETAPA2:
			lcd_acionamento(ETAPA2);
			BOMBA_ON
			delay_seg(5);
			BOMBA_OFF
			delay_seg(2);
			estado = ETAPA3;
			break;
		case ETAPA3:
			lcd_acionamento(ETAPA3);
			BOMBA_ON
			DRENO_ON
			delay_seg(5);
			BOMBA_OFF
			DRENO_OFF
			delay_seg(2);
			estado = ETAPA4;
			break;
		case ETAPA4:
			lcd_acionamento(ETAPA4);
			AGUA_ON
			delay_seg(5);
			AGUA_OFF
			delay_seg(2);
			estado = ETAPA5;
			break;
		case ETAPA5:
			lcd_acionamento(ETAPA5);
			BOMBA_ON
			DET_ON
			RES_ON
			delay_seg(5);
			BOMBA_OFF
			DET_OFF
			RES_OFF
			delay_seg(2);
			estado = ETAPA6;
			break;
		case ETAPA6:
			lcd_acionamento(ETAPA6);
			BOMBA_ON
			RES_ON
			delay_seg(5);
			BOMBA_OFF
			RES_OFF
			lcd_acionamento(ETAPA8);
			delay_seg(2);
			estado = ETAPA7;
			break;
		case ETAPA7:
			lcd_acionamento(ETAPA7);
			BOMBA_ON
			DRENO_ON
			delay_seg(5);
			BOMBA_OFF
			DRENO_OFF
			delay_seg(10);
			estado = ETAPA1;
			break;
		default:
			break;
		}
	}
	estado = INICIO;
	LED_COMPLETA_OFF
	LED_ENXAGUE_OFF
}

void program_modelo(){
	process = O_APRE;
	lcd_prog_apresentacao();
	process = O_COMPLETA_APRE;
	lcd_logo();
	int tipo = O_COMPLETA_APRE;
	int k = 0;
	while(1)
		    {
				//Debounce
				for(k = 0; k<0x1E848; k++);

				//Verifica se o bt enxague foi pressionado, e faz a logica para lavagem completa ou enxague
				if(BT_ENXAGUE == Bit_RESET){
					if(tipo == O_COMPLETA_APRE){
						tipo = O_ENXAGUE_APRE;
						lcd_lavagem(sel_enxague);
						LED_COMPLETA_OFF
						LED_ENXAGUE_ON
						delay_seg(3);
						lcd_lavagem(press_bt);
					}
					else if(tipo == O_ENXAGUE_APRE){
						tipo = O_COMPLETA_APRE;
						lcd_lavagem(sel_lav_comp);
						LED_COMPLETA_ON
						LED_ENXAGUE_OFF
						delay_seg(3);
						lcd_lavagem(press_bt);
					}
				}

				if(tipo == O_ENXAGUE_APRE)
					ENXAGUE_APRE();
				if(tipo == O_COMPLETA_APRE)
					COMPLETA_APRE();
		    }
}

void ENXAGUE_APRE(){
		if(BT_INICIO == Bit_RESET && estado == INICIO){
			while(loop == 0){
				lcd_lavagem(enxague);
				delay_seg(5);
				estado = ETAPA1;
				primeiro_Processo_APRE();
				lcd_acionamento(FINAL);
				delay_seg(2);
			}
			//lcd_init();
			loop = 0;
			estado = INICIO;
			process = O_APRE;
			lcd_lavagem(press_bt);
		}

}

void COMPLETA_APRE(){
		if(BT_INICIO == Bit_RESET && estado == INICIO){
			while(loop == 0){
				lcd_lavagem(lav_comp);
				delay_seg(5);
				estado = ETAPA1;
				primeiro_Processo_APRE();
				estado = ETAPA4;
				segundo_Processo_APRE();
				estado = ETAPA1;
				primeiro_Processo_APRE();
				lcd_acionamento(FINAL);
				delay_seg(2);
			}
			loop = 0;
			estado = INICIO;
			process = O_APRE;
			lcd_lavagem(press_bt);
		}
}

//Funcao enxague
void primeiro_Processo_APRE(){
	while(estado != FINAL){
		switch(estado){
		case ETAPA1:
			lcd_etapa(ETAPA1, 1);
			delay_seg(1);
			AGUA_ON
			delay_seg(1);
			lcd_acionamento(ETAPA1);
			delay_seg(timer.bkp.ciclo_ETAPA1);
			AGUA_OFF
			delay_seg(1);
			lcd_etapa(ETAPA1, 0);
			delay_seg(2);
			estado = ETAPA2;
			break;
		case ETAPA2:
			lcd_etapa(ETAPA2, 1);
			delay_seg(1);
			BOMBA_ON
			delay_seg(1);
			lcd_acionamento(ETAPA2);
			delay_seg(timer.bkp.ciclo_ETAPA2);
			BOMBA_OFF
			delay_seg(1);
			lcd_etapa(ETAPA2, 0);
			delay_seg(2);
			estado = ETAPA3;
			break;
		case ETAPA3:
			lcd_etapa(ETAPA3, 1);
			delay_seg(1);
			lcd_acionamento(ETAPA3);
			delay_seg(1);
			BOMBA_ON
			DRENO_ON
			delay_seg(timer.bkp.ciclo_ETAPA3);
			BOMBA_OFF
			DRENO_OFF
			delay_seg(1);
			lcd_etapa(ETAPA3, 0);
			delay_seg(2);
			estado = FINAL;
			break;
		default:
			estado = FINAL;
			break;
		}
	}
}

//Funcao lavagem completa
void segundo_Processo_APRE(){
	while(estado != FINAL){
		switch(estado){
		case ETAPA4:
			lcd_etapa(ETAPA4, 1);
			delay_seg(1);
			lcd_acionamento(ETAPA4);
			delay_seg(1);
			AGUA_ON
			delay_seg(timer.bkp.ciclo_ETAPA4);
			AGUA_OFF
			delay_seg(1);
			lcd_etapa(ETAPA4, 0);
			delay_seg(2);
			estado = ETAPA5;
			break;
		case ETAPA5:
			lcd_etapa(ETAPA5, 1);
			delay_seg(1);
			lcd_acionamento(ETAPA5);
			delay_seg(1);
			BOMBA_ON
			DET_ON
			RES_ON
			delay_seg(timer.bkp.ciclo_ETAPA5);
			BOMBA_OFF
			DET_OFF
			RES_OFF
			delay_seg(1);
			lcd_etapa(ETAPA5, 0);
			delay_seg(2);
			estado = ETAPA6;
			break;
		case ETAPA6:
			lcd_etapa(ETAPA6, 1);
			delay_seg(1);
			lcd_acionamento(ETAPA6);
			delay_seg(1);
			BOMBA_ON
			RES_ON
			delay_seg(timer.bkp.ciclo_ETAPA6);
			BOMBA_OFF
			RES_OFF
			delay_seg(1);
			lcd_acionamento(ETAPA8);
			delay_seg(2);
			lcd_etapa(ETAPA6, 0);
			delay_seg(2);
			estado = ETAPA7;
			break;
		case ETAPA7:
			lcd_etapa(ETAPA7, 1);
			delay_seg(1);
			lcd_acionamento(ETAPA7);
			delay_seg(1);
			BOMBA_ON
			DRENO_ON
			delay_seg(timer.bkp.ciclo_ETAPA7);
			BOMBA_OFF
			DRENO_OFF
			delay_seg(1);
			lcd_etapa(ETAPA7, 0);
			delay_seg(2);
			estado = FINAL;
			break;
		default:
			estado = FINAL;
			break;
		}
	}

}
